package util.android.cuestionario.fragment;

import util.android.AndroidUtil;
import util.form.CuestionarioContext;
import android.support.v4.view.ViewPager;
import android.view.ViewGroup;

public class CuestionarioFragmentOnPageChangeListener 
implements ViewPager.OnPageChangeListener, CambioPagina
{

	private final CuestionarioContext mContext;
	private int mPosicionAnterior;	
	private final ViewPager mPager;
	
	private int position;
	private EstadoCambioPagina estado; 
	
	public CuestionarioFragmentOnPageChangeListener(CuestionarioContext context, ViewPager pager) {
		mContext = context;
		mPager = pager;
		mPosicionAnterior = pager.getCurrentItem();//posicion inicial
		estado = EstadoCambioPagina.NORMAL;
	}
	
	@Override
	public void onPageSelected(int position) {		
		//AndroidUtil.mostrarToast(mPager.getContext(), "position="+position);
		
		try {
			if(estado==EstadoCambioPagina.NORMAL || estado==EstadoCambioPagina.CONTINUAR) {
				PageView pvAnterior = new PageView(mContext, mPosicionAnterior, null, null);			
				//ViewGroup porque en CuestionarioFragment.onCreateView se obtiene un ViewGroup 
				ViewGroup vAnterior = (ViewGroup) mPager.findViewWithTag(pvAnterior);
				
				if(vAnterior!=null) {
					PageView pvTagAnterior = (PageView)vAnterior.getTag();
					PageViewListener pvlAnterior = pvTagAnterior.getPageViewListener();
					boolean avanzando = position>mPosicionAnterior;
					
					if(estado==EstadoCambioPagina.NORMAL) {						
						pvlAnterior.onAntesCambioPagina(avanzando,pvTagAnterior,this);						
						//this.position = position;
						//this.avanzando = avanzando;						
						if(estado==EstadoCambioPagina.PAUSADO) {
							this.position = position;	
							mPager.setCurrentItem(mPosicionAnterior);
						}
						else {
							estado = EstadoCambioPagina.CONTINUAR;
						}
					}
					
					if(estado==EstadoCambioPagina.CONTINUAR) {
						
						boolean exito;
						if(avanzando) {//salto a la derecha
							exito = pvlAnterior.onSiguientePagina(pvTagAnterior);					
						}
						else {//salto a la izquierda
							exito = pvlAnterior.onAnteriorPagina(pvTagAnterior);
						}				
						
						if(exito) {
							PageView pvActual = new PageView(mContext, position, null, null);			
							ViewGroup vActual = (ViewGroup) mPager.findViewWithTag(pvActual);
							if(vActual!=null) {
								PageView pvTagActual = (PageView)vActual.getTag();
								//pvTagActual.getRootView().scrollTo(0, 0);
								//pvTagActual.getRootView().computeScroll();
								pvTagActual.getPageViewListener().onPaginaSeleccionada(avanzando, pvTagActual);
							}
							mPosicionAnterior = position;
							
							estado = EstadoCambioPagina.NORMAL;
						}
						else {
							estado = EstadoCambioPagina.CANCELADO;
							mPager.setCurrentItem(mPosicionAnterior);
						}						
					}	
					
				}
			}
			else if(estado==EstadoCambioPagina.CANCELADO) {
				estado = EstadoCambioPagina.NORMAL;
			}
									
		}
		catch(Exception ex) {
			AndroidUtil.mostrarExcepcionEnToast(this.mPager.getContext(), ex);
		}
	}
		
	@Override
	public void continuar() throws Exception {
		if(estado==EstadoCambioPagina.PAUSADO) {	
			estado = EstadoCambioPagina.CONTINUAR;						
			mPager.setCurrentItem(position);			
		}		
	}

	@Override
	public void pausar() throws Exception {
		estado = EstadoCambioPagina.PAUSADO;		
	}
	
	@Override
	public void cancelar() throws Exception {
		if(estado==EstadoCambioPagina.PAUSADO)
			estado = EstadoCambioPagina.NORMAL;
		else
			estado = EstadoCambioPagina.CANCELADO;
	}

	@Override
	public void onPageScrollStateChanged(int arg0) {
		
	}

	@Override
	public void onPageScrolled(int arg0, float arg1, int arg2) {
		
	}

}
